import * as Cesium from 'cesium';
import gsap from 'gsap';

export default class RadarMaterialProperty {
  constructor(name) {
    this.name = name; // 为了判断两者是否是同一材质的标记

    this.definitionChanged = new Cesium.Event();
    Cesium.Material._materialCache.addMaterial('RadarMaterial', {
      fabric: {
        type: 'RadarMaterial',
        uniforms: {
          uTime: 0,
        },
        /**
     * czm_materialInput 可用的参数如下
      positionToEyeEC：视点到物体的眼睛空间位置向量。
      normalEC：眼睛坐标系下的法线向量。
      tangentToEyeMatrix：切线到眼睛的矩阵。
      str：切线空间的s向量。
      normal：切线空间的法线向量。
      tangent：切线空间的切线向量。
      bitangent：切线空间的副切线向量。
      lightDirectionEC：眼睛坐标系下的光源方向向量。
      h：半向量，即视线方向和光线方向的平均值。
      s：投影纹理坐标的s分量。
      t：投影纹理坐标的t分量。

      czm_material 使用gpt搜索查看具体属性: cesium czm_material 包含哪些内容，分别说明
     */
        // 自定义 着色器
        source: `czm_material czm_getMaterial(czm_materialInput materialInput) 
           {
                // 生成默认的材质
                czm_material material = czm_getDefaultMaterial(materialInput);


                // 旋转uv
                vec2 newSt = mat2(
                  cos(uTime), -sin(uTime),
                  sin(uTime), cos(uTime)
                ) * (materialInput.st - 0.5);
                newSt = newSt + 0.5;

                // 获取st
                vec2 st = newSt;

                // 设置圆 ，外部透明，内部不透明
                float alpha = 1.0 - step(0.5, distance(st, vec2(0.5)));

                // 按照角度来设置强弱
                float angle = atan(st.x - 0.5, st.y - 0.5);

                // angle 是从 -pi 到 pi 的，所以如果要设置从 0-1 的转变，需要加上pi
                float strength = (angle + 3.14156) / 6.2832;

                // 将强弱与透明度结合
                alpha = alpha * strength;
                material.alpha = alpha;
                material.diffuse = vec3(st.x, st.y, 1.0);
                return material;
            }`,
      },
    });
    this.params = {
      uTime: 0,
    };
    // 动态修改参数值
    gsap.to(this.params, {
      uTime: 6.28, // 旋转一圈
      duration: 2,
      repeat: -1,

      ease: 'linear',
    });
  }
  getType() {
    return `RadarMaterial`;
  }
  getValue(time, result) {
    // 方案一: 动态修改 uniforms.uTime 并更新到 着色器 中
    // let t = performance.now() / 1000;
    // t = t % 1;
    // result.uTime = t;

    // 方案二
    result.uTime = this.params.uTime;

    return result; // 返回材质
  }
  equals(other) {
    // 判断两个材质是否相等
    return (
      other instanceof PolylineTrainMaterialProperty && this.name === other.name
    );
  }
}
